//此工具方法将会挂载到app里 即extend目录下的application

/**
 * 封装typeof方法 检查格式化数据时需要的data数据是否是对象
 * @param {any} value 任意类型数据
 * @returns {string} 返回原始值 或 引用值 的字符串
 */
function typeOf(value: any): string {
  if (value === null) {
    return 'null';
  }

  //原始值时
  if (typeof value !== 'object') {
    //返回原始值
    return typeof value;
  }

  //引用值时
  const toStr = Object.prototype.toString;
  const types = {
    '[object Object]': 'Object',
    '[object Array]': 'Array'
  };
  const res = toStr.call(value);

  return types[res];
}

/**
 * 格式化请求路径参数
 * 参考示例：http://v.juhe.cn/jztk/query?subject=1&model=c1&key=您申请的appKey&testType=rand
 * @param {any} data 数据
 * @param {string} appkey [可选] 聚合数据appkey
 * @returns {string} 符合格式的路径写法 如?subject=1&model=c1&key=您申请的appKey&testType=rand
 */
function formatParams(data: any, appkey?: string): string {
  if (typeOf(data) !== 'Object') {
    throw new Error('Param "data" must be a value of type Object');
  }

  //data为对象时
  let paramStr: string = '?';

  for (let key in data) {
    paramStr += `${key}=${data[key]}&`;
  }

  //返回路径格式：
  //1. 带有appkey
  //2. 不带有appkey且去掉最后的&
  return appkey ? paramStr + 'key=' + appkey : paramStr.slice(0, -1);
}

export default { formatParams, typeOf };
